/**
 * FATFS测试文件
 *
 * 本工程为《FATFS完全学习指南》系列课程中的第一部分入门课程，介绍
 * FATFS基本的接口的使用。配套免费的视频课程用于学习。
 *
 * 作者：李述铜
 * 视频课程：https://lishutong1024.github.io
 * 配套资料：https://www.yuque.com/lishutong-docs/fatfs_api/cp15hpoflevfqxk7
 */
#include <stdio.h>
#include "../fatfs/source/ff.h"
#include "../fatfs/source/diskio.h"

// FATFS结构，以静态结构的方式定义，或者用malloc分配
static FATFS disk1_fs;			// 针对disk1.vhd
static FATFS disk2_fs;			// 针对disk2.vhd

int main(void) {
	// 挂载文件系统
	FRESULT res = f_mount(&disk1_fs, "0:", 1);
	if (res != FR_OK) {
		printf("mount disk1 failed.\n");
		return -1;
	}

	// 挂载文件系统
	res = f_mount(&disk2_fs,  "1:", 1);
	if (res != FR_OK) {
		printf("mount disk2 failed.\n");
		return -1;
	}

	// 打开目录
	DIR dir;
	res = f_opendir(&dir, "0:/rtos");
	if (res != FR_OK) {
		printf("open dir error.\n");
		return -1;
	}

	for (;;) {
		FILINFO file_info;

		// 读取文件信息
		res = f_readdir(&dir, &file_info);
		if (res != FR_OK) {
			printf("read dir failed.");
			break;
		}

		// 检查是否读取完毕
		if (file_info.fname[0] == (TCHAR)0) {
			break;
		}

		// 文件属性
		printf("%s", file_info.fattrib & AM_DIR ? "d" : "-");
		printf("%s", file_info.fattrib & AM_RDO ? "r" : "-");
		printf("%s", file_info.fattrib & AM_HID ? "h" : "-");
		printf("%s", file_info.fattrib & AM_SYS ? "s" : "-");

		// 文件名和大小
		printf("\t%ls\t%lld", file_info.fname, file_info.fsize);

		// 日期和日间
		printf("\t%d-%d-%d %d:%d:%d",
			(file_info.fdate >> 9) + 1980,
			(file_info.fdate >> 5) & 0xF,
			(file_info.fdate & 0x1F),
			(file_info.ftime >> 11) & 0x1F,
			(file_info.ftime >> 5) & 0x3F,
			(file_info.ftime & 0x1F) * 2);


		puts("");
	}
		
	// 在文件关闭时，有文件写入刷新的调用
	f_closedir(&dir);

	// 卸载文件系统
	f_unmount( "0:");
	f_unmount( "1:");
	return 0;
}